Linux上文本处理三剑客：
    grep, egrep, fgrep：文本搜索工具；基于”pattern“对给定文本进行搜索操作。
    sed：Stream EDitor，流编辑器，行编辑工具；文本编辑工具。
    awk：GNU awk，文本格式化工具；文本报告生成器.
============================================
###：grep：打印出符合 pattern（过滤条件）的行
SYNOPSIS：
       grep [OPTIONS] PATTERN [FILE...]
       grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
OPTIONS：
        --color[=WHEN], --colour[=WHEN]：对匹配到的文本着色后高亮显示。
            example：
                WHEN：never, always,  auto（默认）.

        -i, --ignore-case：忽略字符大小写。
        -o, --only-matching：仅显示匹配到的文本。
        -v， --invert-match：反向匹配。
        -E, --extended-regexp：支持扩展的正则表达式。
        -q, --quiet， --silient：不输出任何信息,直接退出。
        -n：输出行号。
        -c：计算找到‘搜索字符串’的次数。
        -A NUM, --after-context=NUM： 匹配结果并将匹配结果的后#行一并显示 
        -B NUM, --before-context=NUM:  匹配结果并将匹配结果的前#行一并显示 
        -C NUM, -NUM, --context=NUM：A and b 显示匹配结果前和后各几行。 
        -F, --fixed-strings：支持使用固定字符串，不支持正则表达式，相当于fgrep。
        -G, --basic-regexp：支持使用基本正则表达式。
        -P, --perl-regexp：支持使用pcre正则表达式。
        -e PATTERN, --regexp=PATTERN：多模式机制。
        -f FILE, --file=FILE：FILE为每行包含了一个pattern的文本文件，即grep script。

基本正则表达式元字符
    字符匹配：
            .：匹配任意单个字符。
            [ ]：匹配范围内的任意单个字符。
            [^ ]：匹配范围外的任意单个字符。
            \d  或者 [:digit:]    :  数字。等效于 [0-9]。
            \D  匹配任意一个除十进制数字以外的字符，等价于[^0-9]  
            \s：匹配任意一个空白符，等价于[\f\n\r\t\v] 
                    \f  匹配一个换页符。
                    \n  匹配一个换行符。  
                    \r  匹配一个回车符。
                    \t  匹配一个制表符。
                    \v  匹配一个垂直制表符。
            \S：匹配非打印字符以外字符。与 [^ \f\n\r\t\v] 等效
            \w：匹配任意一个数字、字母或下画线，等价于[0-9a-zA-Z_]  
            \W：匹配一个除数字、字母或下画线以外的任意一个字符，等价于[^0-9a-zA-Z_]  
            [:lower:]：小写英文字母
            [:upper:]：大写英文字母
            [:alpha:]：所有字母
            [:alnum:]：所有字母和数字,相当于[0-9a-zA-Z]
            [:space:]：空白字符,相当于\s
            [:blank:]：空格或制表符
            [:punct:]：标点符号
            [:xdigit:] ：十六进制字符；任何数量或––F或F
            [:print:] ：任何可打印的字符（不控制字符）
            [:graph:] ：排除空白字符
            [:cntrl:] ：控制字符

    匹配次数：
            *               ：前面的字符任意次（0,1或多次）
            \+              ：前面的字符 1次 或多次
            \?              ：前面的 0次或1次。
            \{m\}        ：前面的字符出现m次，m为非负整数；
            \{m,n\}     ：前面的字符出现m次，m为非负整数；[m,n]

            注意：这几个字符需要转义。

    匹配位置：
            ^ : 锚定行首 
            $ : 锚定行尾
            \<或\b：词首锚定，格式为 \<PATTERN, \bPATTERN
            \>或\b：词尾锚定，格式为 PATTERN\>, PATTERN\b

    分组与引用：
        分组：() 括号进行分组
            pat1\(pat2\)pat3\(pat4\(pat5\)pat6\)
            \(PATTERN\)：将此PATTERN匹配到的字符当作一个整体进行处理。
        引用：\1  \2   \3  分组括号中匹配到的字符被存储于正则表达式内部的变量中。
                \1：pattern匹配到的第一组括号
                \2：pattern匹配到的第二个括号
                \3：pattern匹配到的第三个括号
                .....
                注意：按括号顺序进行排序。

示例： 
        ~]# grep "\<[0-9]\{3,4\}\>" /etc/passwd
        ~]# grep -v "bash$" /etc/passwd
————————————————————————————————
###：egrep：支持使用扩展正则表达式的grep命令，相当于grep -E;
SYNOPSIS
       grep [OPTIONS] PATTERN [FILE...]
       grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
OPTIONS：与grep相同。
        扩展正则表达式的元字符：
                字符匹配：
                    .：任意单个字符
                    [ ]：范围内的任意单个字符
                    [^ ]：范围外的任意单个字符
                    
                匹配次数：
                    *：任意次；
                    ?：0次或1次；
                    +：1次或多次；
                    {m}：匹配m次；
                    {m,n}：至少m次，至多n次；
                    {m,}：最少m次。
                        
                位置锚定：
                    ^：行首
                    $：行尾
                    \<, \b：词首
                    \>, \b：词尾
                    
                分组及引用：
                    (pattern)：分组，括号中的模式匹配到的字符会被记录于正则表达式引擎内部的变量中；
                    后向引用：\1, \2, ...
                或者:
                    a|b：a或者b
                        C|cat：表示C或cat
                        (C|c)at：表示Cat或cat

instantiation：
        ~]# egrep "^(s|S)" /tmp/meminfo
————————————————————————————————
###：sed：用于筛选和转换文本的流编辑器
SYNOPSIS：
       sed [OPTION]... {script-only-if-no-other-script} [input-file]...
DESCRIPTION：
        script：
            地址定界编辑命令

        常用选项：
            -n：不输出模式空间中的内容至屏幕；
            -e script, --expression=script：多点编辑；
            -f  /PATH/TO/SED_SCRIPT_FILE
                每行一个编辑命令；
            -r, --regexp-extended：支持使用扩展正则表达式；
            -i[SUFFIX], --in-place[=SUFFIX]：直接编辑原文件 ；

            ~]# sed  -e  's@^#[[:space:]]*@@'   -e  '/^UUID/d'  /etc/fstab

        地址定界：
            (1) 空地址：对全文进行处理；
            (2) 单地址：
                #：指定行；
                /pattern/：被此模式所匹配到的每一行；
            (3) 地址范围
                #,#：
                #,+#：
                #，/pat1/
                /pat1/,/pat2/
                $：最后一行；
            (4) 步进：~
                1~2：所有奇数行
                2~2：所有偶数行

        编辑命令：
            d：删除；
            p：显示模式空间中的内容；
            a  \text：在行后面追加文本“text”，支持使用\n实现多行追加； 
            i  \text：在行前面插入文本“text”，支持使用\n实现多行插入； 
            c  \text：把匹配到的行替换为此处指定的文本“text”；
            w /PATH/TO/SOMEFILE：保存模式空间匹配到的行至指定的文件中；
            r  /PATH/FROM/SOMEFILE：读取指定文件的内容至当前文件被模式匹配到的行后面；文件合并；
            =：为模式匹配到的行打印行号；
            !：条件取反；
                地址定界!编辑命令；
            s///：查找替换，其分隔符可自行指定，常用的有s@@@, s###等；
                替换标记：
                    g：全局替换；
                    w /PATH/TO/SOMEFILE：将替换成功的结果保存至指定文件中；
                    p：显示替换成功的行；

                练习1：删除/boot/grub/grub2.cfg文件中所有以空白字符开头的行的行首的所有空白字符；
                    ~]# sed  's@^[[:space:]]\+@@' /etc/grub2.cfg
                练习2：删除/etc/fstab文件中所有以#开头的行的行首的#号及#后面的所有空白字符；
                    ~]# sed  's@^#[[:space:]]*@@'  /etc/fstab
                练习3：输出一个绝对路径给sed命令，取出其目录，其行为类似于dirname；
                    ~]# echo "/var/log/messages/" | sed 's@[^/]\+/\?$@@'
                    ~]# echo "/var/log/messages" | sed -r 's@[^/]+/?$@@'

        高级编辑命令：
            h：把模式空间中的内容覆盖至保持空间中；
            H：把模式空间中的内容追加至保持空间中；
            g：把保持空间中的内容覆盖至模式空间中；
            G：把保持空间中的内容追加至模式空间中；
            x：把模式空间中的内容与保持空间中的内容互换；
            n：覆盖读取匹配到的行的下一行至模式空间中；
            N：追加读取匹配到的行的下一行至模式空间中；
            d：删除模式空间中的行；
            D：删除多行模式空间中的所有行；

        示例：
            sed  -n  'n;p'  FILE：显示偶数行；
            sed  '1!G;h;$!d'  FILE：逆序显示文件的内容；
            sed  ’$!d'  FILE：取出最后一行；
            sed  '$!N;$!D' FILE：取出文件后两行；
            sed '/^$/d;G' FILE：删除原有的所有空白行，而后为所有的非空白行后添加一个空白行；
            sed  'n;d'  FILE：显示奇数行；
            sed 'G' FILE：在原有的每行后方添加一个空白行；

————————————————————————————————
###：awk：
推荐博客：
    http://linux.51yip.com/search/awk
    http://www.cnblogs.com/emanlee/p/3327576.html
SYNOPSIS：
    -F fs：指明输入时用到的字段分隔符
    -v var=val：自定义变量
DETAIL：
    1、print：
        ~]# awk '{print $1}' /etc/fstab
        ~]# awk -F : '{print $1}' /etc/passwd

        注意：
                (1) 逗号分隔符；
                (2) 输出的各item可以字符串，也可以是数值；当前记录的字段、变量或awk的表达式；
                (3) 如省略item，相当于print $0; 
                (4) $1 第一段，$2 第二段，$n 第n段。$0代表整行。

    2、变量
        （1） 内建变量
            (1)：FS：输入字段分隔符，默认为空白字符。支持glob通配符，选项要使用双引号。
                ~]# echo "111 222 333"|awk 'FS {print $2}'
                    222
                ~]# echo "111|222|333"|awk 'BEGIN{FS="[|]+"} {print $1}'
                    111

            (2)：OFS：输出字段分隔符，默认为空白字符。支持glob通配符，选项要使用双引号。
                ~]# echo a----b----c | awk 'BEGIN{FS="----";OFS="****"}{print $1,$2,$3}'
                    a****b****c
                ~]# echo "abc" | awk '{OFS=":"}{ print "string",$0}'
                    string:abc
                ~]# awk 'BEGIN{FS=":";OFS=" 的uid是 "}{print $1,$3}' /etc/passwd
                    root 的uid是 0
                    bin 的uid是 1
                    .......

            (3)：RS：输入时的换行符。
                ~]# echo 'a--b--c' | awk 'BEGIN{RS="--"}{print $1,$2,$3}'
                    a  
                    b  
                    c 

            (4)：ORS：输出时的换行符.
                    ~]# cat aa.txt 
                        a
                        b
                        c
                    ~]# awk 'BEGIN{ORS="--"}{print $0}' aa.txt 
                        a--b--c--

            (5)： NF：字段数量{print NF}：字段数量, {print $NF}：最后一个字段。
                    ~]# awk '{print NF,$NF}' /etc/fstab
                        0 
                        1 #
                        2 /etc/fstab
                        10 2016
                        ......

            (6)：NR： 行数。
                    ~]# awk '{print NR}' /etc/fstab
                        1
                        2
                        ....
                        12
                    ~]# awk 'END{print NR}' /etc/fstab
                        12

            (7)：FNR：各文件分别计数；行数；
                ~]# awk '{print FNR}' /etc/fstab /etc/passwd 12
                    1
                    ...
                    12
                    1
                    ...
                    49

            (8)：FILENAME：当前文件名；
                ~]# awk '{print FILENAME}' /etc/fstab   # 每一行都输出一次
                    /etc/fstab
                    ......
                    /etc/fstab
                ~]# awk 'END{print FILENAME}' /etc/fstab
                    /etc/fstab

            (9)：ARGC：命令行参数的个数。
                ~]# awk 'BEGIN{print ARGC}' /etc/fstab
                    2

            (10)：ARGV：数组，保存的是命令行所给定的各参数。

        （2） 自定义变量
            (1) -v var=value

                变量名区分字符大小写；

            (2) 在program中直接定义

    3、printf
            格式化输出：printf FORMAT, item1, item2, ...

                (1) FORMAT必须给出; 
                (2) 不会自动换行，需要显式给出换行控制符，\n
                (3) FORMAT中需要分别为后面的每个item指定一个格式化符号；

                格式符：
                    %c: 显示字符的ASCII码；
                    %d, %i: 显示十进制整数；
                    %e, %E: 科学计数法数值显示；
                    %f：显示为浮点数；
                    %g, %G：以科学计数法或浮点形式显示数值；
                    %s：显示字符串；
                    %u：无符号整数；
                    %%: 显示%自身；

                修饰符：
                    #[.#]：第一个数字控制显示的宽度；第二个#表示小数点后的精度；
                        %3.1f
                    -: 左对齐
                    +：显示数值的符号

    4、操作符
    5、PATTERN
    6、常用的action
    7、控制语句
    8、array
    9、函数